/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package flp.gui.view.random;

import flp.solvers.IOptimizationMonitor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;

/**
 * @author Necro
 * 
 * Klasa nasluchujaca, odpowiedzialna za pobieranie aktualnych danych podczas
 * trwania optymalizacji a nastepnie zaznaczanie ich w odpowiednich strukturach.
 */
public class RandomOptimizationListener extends Thread implements IOptimizationMonitor {

    /** Kwant czasu o jaki odlegle sa od siebie momenty zaznaczania zebranych danych. */
    public static final int TIMESTEP = 100;
    
    /** Handler ktory stworzyl ta instancje monitora. */
    RandomSolverHandler parent;
    
    /** Timer obslugujacy zaznaczanie danych. */
    private Timer timer;
    
    /** Licznik iteracji. */
    private int iter;
    
    /** Najlepszy koszt.*/
    private int topCost;
    
    /** Ilosc iteracji miedzy wyswietleniami */
    private int n;
    
    /** Czas jaki uplynal od poczatku obliczen - do zaznaczenia na osi x */
    private int timeElapsed;
    
    /** Flaga sygnalizujaca rozpoczecie optymalizacji */
    private boolean started;

    
        /** Konstruktor listenera.
     * 
     * @param parent Handler dla obslugiwanej optymalizacji.
     */
    public RandomOptimizationListener(RandomSolverHandler parent) {
        this.parent = parent;
        this.started = false;
    }

        /**
     * Klasa odpowiedzialna za pobieranie danych
     * co okreslony kwant czasu.
     */
    class TimeredDataCollector implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            timeElapsed += TIMESTEP;
            if (n == 0) {
                return;
            }
            
            parent.dataPanel.updateValues(iter, topCost);
            parent.chart.markData(topCost, timeElapsed);
            n=0;



            if (parent.finished) {
                timer.stop();
            }
        }
    }

    @Override
    public void run() {
        timer = new Timer(TIMESTEP, new TimeredDataCollector());
        timer.setDelay(TIMESTEP);
        timer.start();
    }

     /** 
     * Metoda wywolywana z ciala Solver.computeSolution
     * zbierajaca dane z kazdej iteracji by je potem wyswietlic na wykresie.
     */
    public void markProgress(Object[] values) {
        iter = (Integer) values[0];
        topCost = (Integer) values[1];
        n++;
    }

    /** 
     * Metoda wywolywana z ciala Solver.computeSolution
     * zbierajaca dane z kazdej iteracji by je potem wyswietlic na wykresie
     * @deprecated Tylko dla potrzeb testowania
     */
    public void markProgress(String bestCost) {
    //do_nothing
    }
}
